18-2 PおwX禰遢d

在ASP程式設計裡,用來存取資料庫或表格資料的物件統稱 ADO(ActiveX Data Objects),這是一個 ASP 內建的資料庫存取元件,可以經由 JavaScript/JScript、VBScript 等語言來控制資料庫的存取,並可連接多種資料庫,包括 SQL Server、Oracle、Access 等支援ODBC的資料庫。ADO 主要包含 Connection、Recordset 及 Command 三種物件,本小節將介紹與 Connection 相關的資料庫操作。

使用 ADO 的 Connection 物件來進行資料庫的檢視查詢,主要有以下四個步驟:

  1. 建立資料庫連結,然後開啟資料庫:
    使用「Server.CreateObject」定義一個 ADO 的 Connection 物件,然後使用其「Open」的方法來開啟資料庫來源,範例程式碼如下: conn = Server.CreateObject("ADODB.Connection"); 接著我們可以設定 conn 物件的 ConnectionString 性質來指定資料庫,共有四種作法:
    1. 直接指定 Access 資料庫在本機硬碟的路徑: conn.ConnectionString = "DBQ=資料庫檔案;Driver={Microsoft Access Driver (*.mdb)};Driverld=25;FIL=MS Access;UID=**;PWD=**";
    2. 指定 DSN(資料來源名稱): conn.ConnectionString = "資料來源名稱";
    3. 直接連結至 SQL Server 資料庫: conn.ConnectionString = "Driver={SQL Server};Datebase=資料庫名稱;Server=位址;UID=**;PWD=**";
    4. 直接連結至 UNIX 的 MySQL 資料庫: conn.ConnectionString = "Driver={MySQL};Datebase=資料庫名稱;Server=位址;UID=**;PWD=**";
    使用以上任一方法即可連結到你想要連結的本機或遠端資料庫。最後再用 conn 物件的 Open 方法,來開啟資料庫: conn.Open();

  2. 執行SQL指令,並將查詢結果儲存於 Recordset 中:若是檢視查詢,我們可將結果存至 RecordSet 物件變數「rs」中,以便後續取用,典型程式碼如下: sql = "Select * from testTable"; rs = conn.Execute(sql); 以上的程式碼將 SQL 指令所查詢到的結果儲存到 Recordset 物件 rs 中。若不是檢視查詢,則不需要將結果存放於變數 rs。
  3. 取得欄位名稱及內容:若是檢視查詢,我們可以使用下列的的方式來取得欄位名稱及內容等資訊:
    • rs.EOF:是否已指到最後一筆資料,是為True,反之為False
    • rs.Fields.Count:RecordSets的欄位數
    • rs(i).Name:第i個欄位的欄位名稱
    • rs("欄位名稱"):讀取某個特定欄位名稱的資料
    • rs(i):第i個欄位的資料
    • rs.MoveNext:將指標移到下一筆
    • rs.MovePrev:將指標移到上一筆
    • rs.MoveFirst:將指標移到第一筆
    • rs.MoveLast:將指標移到最後一筆
    例如,若要印出欄位名稱,可以使用下列典型程式碼: for (i=0; i<rs.Fields.Count; i++) Response.write(rs(i).Name+"<br>"); 若要印出每一筆資料的每一個欄位值,可以使用下列典型程式碼: while (!rs.EOF){ for (i=0; i<rs.Fields.Count; i++) Response.write(rs(i)+" "); Response.write("<br>\n"); rs.MoveNext(); } 以上的程式碼由 rs(i) 讀取資料庫欄位的資料,rs.MoveNext() 將 Recordset 的資料指標移到下一筆,經由 rs.EOF 來判斷是否已到了最末筆資料,並配合 while 迴圈即可得到所有查詢結果的資料。

  4. 關閉 RecordSet 及資料庫連結:範例程式碼如下: rs.Close(); conn.Close();
例如,我們可以在網頁中印出 Access 資料庫 asp/example/database/test.mdb 裡面的資料表 testTable 的內容:

Example(database/listdb01.asp):

上述範例的原始檔如下:

原始檔(database/listdb01.asp):(灰色區域按兩下即可拷貝)
<%@ language="jscript" %>
<% title="以 JScript 進行資料庫列表:使用資料庫路徑" %>
<!--#include file="../head.inc"-->
<hr>

<%
//====== Step 1:建立資料庫連結,然後開啟資料庫
conn = Server.CreateObject("ADODB.Connection");
conn.ConnectionString = "DBQ=" + Server.MapPath("test.mdb") + ";Driver={Microsoft Access Driver (*.mdb)};Driverld=25;FIL=MS Access;";
conn.Open();

//====== Step 2:執行SQL指令,並將查詢結果儲存於 Recordset 中
sql = "SELECT * FROM testTable";	//從資料表 testTable 取出所有資料
rs = conn.Execute(sql);
%>

<table border=1 align=center>
<tr bgcolor="cyan">
<%
//====== Step 3:透過 RecordSet 集合取得欄位的內容
//印出欄位名稱
for (i=0; i<rs.Fields.Count; i++)
	Response.write("<th>"+rs(i).Name+"</th>\n");
%>
</tr>
<%
//印出每一筆資料
while (!rs.EOF) {
	Response.write("<tr>\n");
	for (i=0; i<rs.Fields.Count; i++)
		Response.write("<td>"+rs(i)+"&nbsp;</td>\n");
	rs.MoveNext();
}
%>
</table>

<%
//====== Step 4:關閉 RecordSet 及資料庫連結
rs.Close();
conn.Close();
%>

<hr>
<!--#include file="../foot.inc"-->

在上述範例中,我們使用「直接指定資料庫在本機硬碟的路徑」的方式來連結資料庫,其中的 SQL 指令「SELECT * FROM testTable」代表「從資料表 testTable 取出所有資料」。其它說明皆以註解的方式寫在程式碼中,所以在此不再贅述。若讀者對 VBScript 比較熟悉,也可以使用 VBScript 來進行類似的工作,其流程完全一樣,可參考此範例:asp/example/database/listdb01_vbs.asp

Hint
在上述範例中的最後一筆資料,其中的 NickName 欄位和 Percentage 欄位都未填入資料,但是 NickName 欄位的並無預設值,因此由資料庫抓回來的資料顯示為 null;另,Percentage 欄位的預設值是 0,所以沒有印出 0。這些欄位的屬性及其預設值都可由 Access 資料表的「設計檢視」選單來設定。

若要使用 DSN 連結資料庫,首先我們必須先在伺服器設定 DSN(詳細流程請見上一小節),然後就可以在 ASP 內經由 DSN 來指定資料庫(可以是近端或是遠端)。以上一個範例而言,若要由 DSN 來連結資料庫,而不直接指定資料庫,只要把下一列敘述:

Conn.ConnectionString = "DBQ=" + Server.MapPath("test.mdb") + ";Driver={Microsoft Access Driver (*.mdb)};Driverld=25;FIL=MS Access;"; 改成下一列即可: Conn.ConnectionString = "dsn4test"; 其中 dsn4test 必須已被設定為指向 test.mdb 的 ODBC 資料來源。相關 JScript 範例可見 asp/example/database/listdb02.asp,VBScript 範例則可見 asp/example/database/listdb02.asp

對於資料庫的檢視和列印,是常被用到的功能,因此我們將此功能寫成一個函數 listQueryResult(),並存放於 listQueryResult.inc 中,其內容如下:

原始檔(listQueryResult.inc):(灰色區域按兩下即可拷貝)
<!-- List a table in a given database -->
<!-- "database" is the full path to a database -->
<!-- "table" is the table to be listed -->

<script runat=server language=jscript>
function listQueryResult(database, sql){
var Conn = Server.CreateObject("ADODB.Connection");
Conn.ConnectionString = "DBQ=" + Server.MapPath(database) + ";Driver={Microsoft Access Driver (*.mdb)};Driverld=25;FIL=MS Access;";
Conn.Open();
var RS = Conn.Execute(sql);

Response.write("<table border=1 align=center>");
Response.write("<tr align=center bgcolor=cyan>");

for (var i=0; i<RS.Fields.Count; i++)
	Response.write("<th>"+RS(i).Name+"</th>\n");
Response.write("</tr>")

color=["#ffffdd", "#ffeeee", "#eeffee", "#e0e0f9", "#eeeeff"];	// 顏色矩陣
k=0;
while (!RS.EOF) {
	Response.write("<tr bgcolor=" + color[k] + ">");
	for (i=0; i<RS.Fields.Count; i++)
		Response.write("<td>" + RS(i) + "&nbsp;</td>");
	Response.write("</tr>");
	k=k+1;
	if (k==color.length)
		k=0;
	RS.MoveNext();
}
RS.Close();
Conn.Close();
Response.write("</table>");
}
</script>


<script runat=server language=vbscript>
Function listQueryResult(database, sql)
set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DBQ=" & Server.MapPath(database) & ";Driver={Microsoft Access Driver (*.mdb)};Driverld=25;FIL=MS Access;"
Set RS = Conn.Execute(sql)

Response.Write("<table border=1 align=center>")
Response.Write("<tr align=center bgcolor=cyan>")
dim i
For i=0 to RS.Fields.Count-1
	Response.Write("<th>" & RS(i).Name & "</th>")
next
Response.Write("</tr>")

color=Array("#ffffdd", "#ffeeee", "#eeffee", "#e0e0f9", "#eeeeff")	' 顏色矩陣
k=0
Do While NOT RS.EOF
	Response.Write("<tr bgcolor=" & color(k) & ">")
	For i=0 to RS.Fields.Count-1
		Response.Write("<td>" & RS(i) & "&nbsp;</td>")
	next
	Response.Write("</tr>")
	k=k+1
	If k=ubound(color)+1 Then
		k=0
	End If
	RS.MoveNext
Loop
RS.Close
Conn.Close
Response.Write("</table>")
End Function
</script>

在上述原始碼中,我們分別寫了適用於 JScript 和 VBScript 的函數,因此無論是使用 JScript 或 VBScript 的 ASP 網頁,都可以使用此包含檔來列出資料庫查詢的結果。 使用上述的函數來進行資料庫列表,程式碼就會乾乾淨淨,範例如下:

Example(database/listdb03.asp):

其原始碼如下:

原始檔(database/listdb03.asp):(灰色區域按兩下即可拷貝)
<%@ language="jscript" %>
<% title="以 JScript 進行資料庫列表:使用 listQueryResult() 函數" %>
<!--#include file="../head.inc"-->
<hr>

<!--#include file="../listQueryResult.inc"-->
<%
database="test.mdb";
sql="select * from testTable";
listQueryResult(database, sql);
%>

<hr>
<!--#include file="../foot.inc"-->

若使用 VBScript,則可見此範例:asp/example/database/listdb03_vbs.asp

前述的範例說明了如何進行資料庫的檢視查詢,並將結果顯示於 ASP 網頁。一般而言,SQL 指令已經具有對資料庫進行檢視、新增、修改、刪除等功能(後續兩小節有詳細說明),因此只要使用適當的 SQL 指令,再加上前述的方法,即可對資料庫進行完全的處理。


JScript 程式設計與應用:用於伺服器端的 ASP 環境